/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bean;

import datos.Contrato;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import datos.EmpresaContratista;
import java.util.ArrayList;
import java.util.Iterator;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import negocio.GestorConsultaObraLocal;
import negocio.GestorObraLocal;


/**
 *
 * @author Ing. Monica Merlo, Ing. Agustin  Fernandez
 */
public class EmpresaBean {


    @EJB(beanName = "GestorConsultaObraBean")
    private GestorConsultaObraLocal gestorConsultaObraBean;

    @EJB(beanName = "GestorObraBean")
    private GestorObraLocal gestorObraBean;

    private int id;
    private String cuit;
    private String razonSocial;
    private String email;
    private String telefono;
    private String paginaWeb;
    private int idDomicilio;
    private String calle;
    private String numero;
    private String barrio;
    private int piso;
    private String depto;
    private String codPostal;
    private String pais;
    private int idContrato;
    private Date fechaContrato;
    private String tituloContrato;
    private String plazoContrato;
    private String tipoPlazoContrato="DIAS";
    private String observacionesContrato;
    private String periodoCertificacionContrato;
    private int idObraContrato;
    private boolean mostrarModificar = false;
    private boolean mostrarAgregar = false;

    private List obrasPublicasFiltradas = null;
    private boolean filtroAplicado = false;



    /** Creates a new instance of EmpresaBean */
    public EmpresaBean() {
    }

    /**
     * @return the id
     */
    public int getIdDomicilio() {
        return idDomicilio;
    }

    /**
     * @param idDomicilio
     */
    public void setIdDomicilio(int idDomicilio) {
        this.idDomicilio = idDomicilio;
    }

    /**
     * @return the calle
     */
    public String getCalle() {
        return calle;
    }

    /**
     * @param calle the calle to set
     */
    public void setCalle(String calle) {
        this.calle = calle;
    }

    /**
     * @return the numero
     */
    public String getNumero() {
        return numero;
    }

    /**
     * @param numero the numero to set
     */
    public void setNumero(String numero) {
        this.numero = numero;
    }

    /**
     * @return the barrio
     */
    public String getBarrio() {
        return barrio;
    }

    /**
     * @param barrio the barrio to set
     */
    public void setBarrio(String barrio) {
        this.barrio = barrio;
    }

    /**
     * @return the piso
     */
    public int getPiso() {
        return piso;
    }

    /**
     * @param piso the piso to set
     */
    public void setPiso(int piso) {
        this.piso = piso;
    }

    /**
     * @return the depto
     */
    public String getDepto() {
        return depto;
    }

    /**
     * @param depto the depto to set
     */
    public void setDepto(String depto) {
        this.depto = depto;
    }

    /**
     * @return the codPostal
     */
    public String getCodPostal() {
        return codPostal;
    }

    /**
     * @param codPostal the codPostal to set
     */
    public void setCodPostal(String codPostal) {
        this.codPostal = codPostal;
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the cuit
     */
    public String getCuit() {
        return cuit;
    }

    /**
     * @param cuit the cuit to set
     */
    public void setCuit(String cuit) {
        this.cuit = cuit;
    }

    /**
     * @return the razonSocial
     */
    public String getRazonSocial() {
        return razonSocial;
    }

    /**
     * @param razonSocial the razonSocial to set
     */
    public void setRazonSocial(String razonSocial) {
        this.razonSocial = razonSocial;
    }

    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return the pais
     */
    public String getPais() {
        return pais;
    }

    /**
     * @param pais the pais to set
     */
    public void setPais(String pais) {
        this.pais = pais;
    }

    /**
     *
     * @return
     */
    public List<String> getPaises() {
        List lp = gestorObraBean.paises();
        ArrayList arrayPaises = new ArrayList<String>();
        Iterator i = lp.iterator();
        datos.Pais p;
        while(i.hasNext()){
            p = (datos.Pais) i.next();
            arrayPaises.add(p.getNombre());
        }
        return (List<String>) arrayPaises;
    }

    /**
     *
     * @return
     */
    public List<String> getEstadosContrato() {
        return (List<String>) gestorObraBean.estadosContrato();
    }

    /**
     *
     * @return
     */
    public List<String> getPeriodosCertificacion() {
        return (List<String>) gestorObraBean.periodosCertificacion();
    }

    /**
     * @return the idContrato
     */
    public int getIdContrato() {
        return idContrato;
    }

    /**
     * @param idContrato the idContrato to set
     */
    public void setIdContrato(int idContrato) {
        this.idContrato = idContrato;
    }

    /**
     * @return the fechaContrato
     */
    public Date getFechaContrato() {
        return fechaContrato;
    }

    /**
     * @param fechaContrato the fechaContrato to set
     */
    public void setFechaContrato(Date fechaContrato) {
        this.fechaContrato = fechaContrato;
    }

    /**
     * @return the tituloContrato
     */
    public String getTituloContrato() {
        return tituloContrato;
    }

    /**
     * @param tituloContrato the tituloContrato to set
     */
    public void setTituloContrato(String tituloContrato) {
        this.tituloContrato = tituloContrato;
    }

    /**
     * @return the estadoContrato
     */
    public String getPlazoContrato() {
        return this.plazoContrato;
    }

    /**
     * @param plazoContrato
     */
    public void setPlazoContrato(String plazoContrato) {
        this.plazoContrato = plazoContrato;
    }

    /**
     * @return the observacionesContrato
     */
    public String getObservacionesContrato() {
        return observacionesContrato;
    }

    /**
     * @param observacionesContrato the observacionesContrato to set
     */
    public void setObservacionesContrato(String observacionesContrato) {
        this.observacionesContrato = observacionesContrato;
    }

    /**
     * @return the periodoCertificacionContrato
     */
    public String getPeriodoCertificacionContrato() {
        return periodoCertificacionContrato;
    }

    /**
     * @param periodoCertificacionContrato the periodoCertificacionContrato to set
     */
    public void setPeriodoCertificacionContrato(String periodoCertificacionContrato) {
        this.periodoCertificacionContrato = periodoCertificacionContrato;
    }

    /**
     * @return the mostrarModificar
     */
    public boolean isMostrarModificar() {
        return mostrarModificar;
    }

    /**
     * @param mostrarModificar the mostrarModificar to set
     */
    public void setMostrarModificar(boolean mostrarModificar) {
        this.mostrarModificar = mostrarModificar;
    }

    /**
     * @return the obrasPublicasFiltradas
     */
    public List getObrasPublicasFiltradas() {
        if(!filtroAplicado)this.obrasPublicasFiltradas = this.gestorObraBean.consultarObras();
        return this.obrasPublicasFiltradas;
    }

    /**
     * @param obrasPublicasFiltradas the obrasPublicasFiltradas to set
     */
    public void setObrasPublicasFiltradas(List obrasPublicasFiltradas) {
        this.obrasPublicasFiltradas = obrasPublicasFiltradas;
    }

    /**
     * @return the filtroAplicado
     */
    public boolean isFiltroAplicado() {
        return filtroAplicado;
    }

    /**
     * @param filtroAplicado the filtroAplicado to set
     */
    public void setFiltroAplicado(boolean filtroAplicado) {
        this.filtroAplicado = filtroAplicado;
    }

    /**
     *
     * @param e
     */
    public void modificarContratoOyente(ActionEvent e) {
        UIParameter component = (UIParameter) e.getComponent().findComponent("idEmpresa");
        this.setId((Integer) Integer.parseInt(component.getValue().toString()));
        component = (UIParameter) e.getComponent().findComponent("idObra");
        this.idObraContrato = (Integer) Integer.parseInt(component.getValue().toString());
        Contrato contr = this.gestorObraBean.encontrarContratoPorEmpresa(this.getId(), this.getIdObraContrato());
        if (contr != null) {
            this.setPlazoContrato(contr.getPlazo().toUpperCase());
            this.setTipoPlazoContrato(contr.getTipoPlazo().toUpperCase());
            this.setFechaContrato(contr.getFecha());
            this.setIdContrato(contr.getId());
            this.setObservacionesContrato(contr.getObservaciones());
            if(contr.getIdPeriodoCertificacion()!=null)this.setPeriodoCertificacionContrato(contr.getIdPeriodoCertificacion().getNombre());
            else this.setPeriodoCertificacionContrato("");
            this.setTituloContrato(contr.getTitulo());
        } else {
            this.setPlazoContrato("");
            this.setTipoPlazoContrato("");
            this.setFechaContrato(null);
            this.setObservacionesContrato("");
            this.setPeriodoCertificacionContrato("");
            this.setTituloContrato("");
        }
        this.mostrarModificar = true;
    }

    /**
     *
     * @return
     */
    public String modificarContrato() {
        this.gestorObraBean.modificarContratoDeObra(this.getIdObraContrato(), this.getId(),
                this.getFechaContrato(), this.getTituloContrato().toUpperCase(), this.getPlazoContrato().toUpperCase(),
                this.getTipoPlazoContrato().toUpperCase(), this.getPeriodoCertificacionContrato().toUpperCase(), this.getObservacionesContrato().toUpperCase());
        this.setMostrarModificar(false);
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Contrato guardado con exito", ""));
        return null;
    }

    /**
     *
     * @param e
     */
    public void cancelarOyente(ActionEvent e) {
        this.setRazonSocial("");
        this.setPlazoContrato("");
        this.setTipoPlazoContrato("");
        this.setFechaContrato(null);
        this.setObservacionesContrato("");
        this.setPeriodoCertificacionContrato("");
        this.setTituloContrato("");
        this.setCuit("");
        this.setEmail("");
        this.setTelefono("");
        this.setPaginaWeb("");
        this.setBarrio("");
        this.setCalle("");
        this.setNumero("");
        this.setDepto("");
        this.setPiso(0);
        this.setCodPostal("");
        this.setMostrarModificar(false);
        this.setMostrarAgregar(false);
        this.setFiltroAplicado(false);
    }



    /**
     *
     * @return
     */
    public String filtrarObrasPublicasPorEmpresa(){
        this.obrasPublicasFiltradas = this.gestorConsultaObraBean.filtrarObrasPublicasPorEmpresa(this.razonSocial.toUpperCase());
        this.filtroAplicado = true;
        this.setMostrarModificar(false);
        this.setMostrarAgregar(false);
        return null;
    }

    /**
     * @return the idObraContrato
     */
    public int getIdObraContrato() {
        return idObraContrato;
    }

    /**
     * @param idObraContrato the idObraContrato to set
     */
    public void setIdObraContrato(int idObraContrato) {
        this.idObraContrato = idObraContrato;
    }

    /**
     * @return the tipoPlazoContrato
     */
    public String getTipoPlazoContrato() {
        return tipoPlazoContrato;
    }

    /**
     * @param tipoPlazoContrato the tipoPlazoContrato to set
     */
    public void setTipoPlazoContrato(String tipoPlazoContrato) {
        this.tipoPlazoContrato = tipoPlazoContrato;
    }

    /**
     *
     * @return
     */
    public List getEmpresasContratistas() {

        return this.gestorObraBean.empresasContratistas();
    }

    /**
     *
     * @return
     */
    public List getEmpresas() {

        return this.gestorObraBean.empresas();
    }

    /**
     *
     * @return
     */
    public String modificarEmpresa() {
        boolean existe = this.gestorObraBean.existeRazonEmpresaModificar(this.razonSocial.toUpperCase(), this.id);

        FacesContext context = FacesContext.getCurrentInstance();
        if (!existe) {

            EmpresaBean empresaBean = (EmpresaBean) context.getELContext().getELResolver().getValue(context.getELContext(), null, "EmpresaBean");

            this.gestorObraBean.modificarEmpresa(empresaBean.getId(), empresaBean.getCuit(), empresaBean.getEmail(), empresaBean.getPaginaWeb(), empresaBean.getTelefono(),empresaBean.getRazonSocial(), empresaBean.getPais(), empresaBean.getBarrio(), empresaBean.getCalle(), empresaBean.getCodPostal(), empresaBean.getDepto(), empresaBean.getNumero(), empresaBean.getPiso());
            this.mostrarAgregar = false;
            this.mostrarModificar = false;
            context.addMessage(null, new FacesMessage("Empresa Contratista modificada con exito", ""));
            return null;
        } else {
            this.setRazonSocial("");
            context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ya existe una Empresa Contratista con ese nombre", ""));
            return null;
        }
    }

    /**
     *
     * @param e
     */
    public void eliminarEmpresaOyente(ActionEvent e) {
        UIParameter component = (UIParameter) e.getComponent().findComponent("idBorrar");
        this.setId((Integer) Integer.parseInt(component.getValue().toString()));
    }

    /**
     *
     * @return
     */
    public String eliminarEmpresa() {
        FacesContext context = FacesContext.getCurrentInstance();
        if (!this.gestorObraBean.empresaTieneObrasAsignadas(id)) {
            EmpresaContratista e = new EmpresaContratista();
            e.setId(id);
            this.gestorObraBean.eliminarEmpresa(e);
            context.addMessage(null, new FacesMessage("Empresa eliminada con exito", ""));
        } else {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "No puede eliminar esa Empresa Contratista porque tiene Obras Públicas asignadas", ""));
        }
        return null;
    }

    /**
     *
     * @param e
     */
    public void guardarEmpresaOyente(ActionEvent e){
        this.setRazonSocial("");
        this.setCuit("");
        this.setEmail("");
        this.setTelefono("");
        this.setPaginaWeb("");
        this.setCalle("");
        this.setNumero("");
        this.setDepto("");
        this.setPiso(0);
        this.setBarrio("");
        this.setCodPostal("");
        this.setPais("");

        this.setMostrarAgregar(true);
        this.setMostrarModificar(false);


    }


    
    /**
     * @return the mostrarAgregar
     */
    public boolean isMostrarAgregar() {
        return mostrarAgregar;
    }

    

    private void setMostrarAgregar(boolean mostrarAgregar) {
        this.mostrarAgregar = mostrarAgregar;
    }

    

    /**
     *
     * @return
     */
    public String guardarEmpresa() {

        boolean existe = this.gestorObraBean.existeRazonSocial(this.getRazonSocial().toUpperCase());
        FacesContext context = FacesContext.getCurrentInstance();

        if (!existe) {
            this.gestorObraBean.agregarEmpresa(cuit, razonSocial.toUpperCase(),
                    email.toUpperCase(), paginaWeb.toUpperCase(), telefono,
                    calle.toUpperCase(), numero, depto.toUpperCase(),
                    piso, barrio.toUpperCase(), codPostal.toUpperCase(), pais.toUpperCase());


            this.mostrarAgregar = false;
            this.mostrarModificar = false;
            context.addMessage(null, new FacesMessage("Empresa Contratista guardada con exito", ""));
            return null;
        } else {
            this.setRazonSocial("");
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ya existe una Empresa Contratista con esa Razon Social", ""));
            return null;
        }

    }


    /**
     *
     * @param e
     */
    public void modificarEmpresaOyente(ActionEvent e) {
            this.setMostrarAgregar(false);
            this.setMostrarModificar(true);
            UIParameter component = (UIParameter) e.getComponent().findComponent("idModificar");
            this.setId((Integer) Integer.parseInt(component.getValue().toString()));


            EmpresaContratista empresa = this.gestorObraBean.encontrarEmpresaPorId(this.getId());

            this.setCuit(empresa.getCuit());
            this.setRazonSocial(empresa.getRazonSocial());
            this.setEmail(empresa.getEmail());
            this.setPaginaWeb(empresa.getPaginaWeb());
            this.setTelefono(empresa.getTelefono());


            this.setIdDomicilio(empresa.getIdDomicilio().getId());

            this.setCalle(empresa.getIdDomicilio().getCalle());

            this.setNumero(empresa.getIdDomicilio().getNumero());

            this.setDepto(empresa.getIdDomicilio().getDepto());

            this.setPiso(empresa.getIdDomicilio().getPiso());

            this.setBarrio(empresa.getIdDomicilio().getBarrio());

            this.setCodPostal(empresa.getIdDomicilio().getCodPostal());

            if (empresa.getIdPais() != null) {
                this.setPais(empresa.getIdPais().getNombre());
            } else {
                this.setPais("");
            }     
    }

    /**
     * @return the paginaWeb
     */
    public String getPaginaWeb() {
        return paginaWeb;
    }

    /**
     * @param paginaWeb the paginaWeb to set
     */
    public void setPaginaWeb(String paginaWeb) {
        this.paginaWeb = paginaWeb;
    }

    /**
     * @return the telefono
     */
    public String getTelefono() {
        return telefono;
    }

    /**
     * @param telefono the telefono to set
     */
    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }
}
